package Tudy

import (
	"fmt"
	"math"
	"os"
)

var str2 =[]byte{}
var temp =0

func Start(){
	fmt.Println("属性文法为")
	fmt.Println("N->.S  {S.f=1;print(S.v)}")
	fmt.Println("S->BS1    {S1.f=S.f+1;B.f=S.f;S.v=B.v+S1.v}")
	fmt.Println("S->ε     {S.v=0}")
	fmt.Println("B->0      {B.v=0}")
	fmt.Println("B->1      {B.v=2^(-B.f)}")
	fmt.Println( "输入字符串：")
	var s string
	fmt.Scan(&s)
	str2=[]byte(s)
	N()
}

func Match2(s byte){
	if str[temp]!=s{
		fmt.Println("syntax error")
	}else{
		temp++
	}
}

func ParseS(f float64)float64{
	var Bf,Bv,Slf,Slv,Sv float64
	if temp==len(str){
		return 0
	}
	if str[temp]=='0'||str[temp]=='1'{
		Bf=f
		Bv=ParseB(Bf)
		Slf=f+1
		Slv=ParseS(Slf)
		Sv=Bv+Slv
	}else if str[temp]=='#'{
		Sv=0
	}else{
		fmt.Println("syntax error")
		os.Exit(0)
	}
	return Sv
}

func ParseB(f float64)float64{
	var Bv float64
	if str[temp]=='0'{
		Match2('0')
		Bv=0
	}else if str[temp]=='1'{
		Match2('1')
		Bv=math.Pow(2,-f)
	}else {
		fmt.Println("Synyax error")
		os.Exit(0)
	}
	return Bv
}

func N(){
	var Sf float64
	var Sv float64
	if str[temp]=='.'{
		Match2('.')
		Sf=1
		Sv=ParseS(Sf)
		fmt.Println("S.val=",Sv)
	}else{
		fmt.Println("Syntax error")
	}
}

func main1() {
	Start()
}
